// import com.alibaba.druid.sql.ast.*;
// import com.alibaba.druid.sql.visitor.SQLASTVisitor_ptr;

// import java.util.ArrayList;
// import java.util.List;
#pragma once
#include "../SQLObjectImpl.h"
#include "../SQLReplaceable.h"
#include "../SQLStatementImpl.h"

class SQLIfStatement_ElseIf : virtual public SQLObjectImpl, virtual public SQLReplaceable
{
public:
  SQLExpr_ptr condition;
  SQLStatement_list_ptr statements;

  SQLIfStatement_ElseIf();
  SHAREDOBJECT(SQLIfStatement_ElseIf);

  // @Override
  void accept0(SQLASTVisitor_ptr visitor);

  SQLStatement_list_ptr getStatements();

  void setStatements(SQLStatement_list_ptr statements);

  SQLExpr_ptr getCondition();

  void setCondition(SQLExpr_ptr condition);

  // @Override
  BOOL_ptr replace(SQLExpr_ptr expr, SQLExpr_ptr target);

  SQLObject_ptr clone();
};

class SQLIfStatement_Else : virtual public SQLObjectImpl
{
public:
  SQLStatement_list_ptr statements;

  SQLIfStatement_Else();
  SHAREDOBJECT(SQLIfStatement_Else);

  // @Override
  void accept0(SQLASTVisitor_ptr visitor);

  SQLStatement_list_ptr getStatements();

  void setStatements(SQLStatement_list_ptr statements);

  SQLObject_ptr clone();
};

class SQLIfStatement : virtual public SQLStatementImpl, virtual public SQLReplaceable
{
public:
  SQLExpr_ptr condition;
  SQLStatement_list_ptr statements;
  SQLIfStatement_ElseIf_list_ptr elseIfList;
  SQLIfStatement_Else_ptr elseItem;

  SQLIfStatement();
  SHAREDOBJECT(SQLIfStatement);

  SQLObject_ptr clone();

  // @Override
  void accept0(SQLASTVisitor_ptr visitor);

  SQLExpr_ptr getCondition();

  void setCondition(SQLExpr_ptr condition);

  SQLStatement_list_ptr getStatements();

  void addStatement(SQLStatement_ptr statement);

  SQLIfStatement_ElseIf_list_ptr getElseIfList();

  SQLIfStatement_Else_ptr getElseItem();

  void setElseItem(SQLIfStatement_Else_ptr elseItem);

  // @Override
  BOOL_ptr replace(SQLExpr_ptr expr, SQLExpr_ptr target);

  virtual string_ptr getClass() { return make_string_ptr("SQLIfStatement"); }
};
